# !/usr/bin/env python
# -*- coding: utf-8 -*-
"""
 -------------------------------------------------
    File Name:     settings_local.py
    Description:   项目配置
 -------------------------------------------------
 """
import os
from datetime import timedelta
from pathlib import Path

# from conf.env import *

# Application definition

# ================================================= #
# ****************** 原本配置 ********************** #
# ================================================= #

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "django-insecure-%c)qsk8^%#@v1ux-nr^k_9)_6-a9f))@j0#3%@^*0+_3#ny5a5"   # 秘钥

INSTALLED_APPS = [
    "django.contrib.admin",  # 管理员站点
    "django.contrib.auth",  # 认证系统
    "django.contrib.contenttypes",  # 内容类型框架
    "django.contrib.sessions",  # 会话框架
    "django.contrib.messages",  # 消息框架
    "django.contrib.staticfiles",  # 静态文件框架
]

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",    # 安全中间件
    "django.contrib.sessions.middleware.SessionMiddleware",  # 会话中间件
    "django.middleware.common.CommonMiddleware",    # 通用中间件
    "django.middleware.csrf.CsrfViewMiddleware",    # csrf中间件
    "django.contrib.auth.middleware.AuthenticationMiddleware",  # 认证中间件
    "django.contrib.messages.middleware.MessageMiddleware",  # 消息中间件
    "django.middleware.clickjacking.XFrameOptionsMiddleware",    # 点击劫持
]

# ================================================= #
# ****************** 自定义配置 ********************* #
# ================================================= #

# 注册应用
INSTALLED_APPS.extend([
    "apps.users",  # 用户管理
    "apps.test_projects",  # 测试项目管理
    "apps.api_tests",  # 接口管理
    "apps.scenes",  # 场景管理
    "apps.test_tasks",  # 任务管理
    "apps.cronjob",  # 定时任务管理
    "apps.bugs",  # 缺陷管理
    "apps.utils",    # 工具管理
])

# 注册django应用
INSTALLED_APPS.extend([
    "django_filters",  # 过滤器
])

# 注册第三方应用
INSTALLED_APPS.extend([
    "rest_framework",  # drf应用，前后分离技术
])

# ================================================= #
# ********************* 配置项 ********************* #
# ================================================= #

REST_FRAMEWORK = {
    # 配置drf使用的过虑器
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
}

# ================================================= #
# ********************** JWT ********************** #
# ================================================= #
# 1. 注册jwt应用
INSTALLED_APPS.extend([
    "rest_framework_simplejwt",  # jwt应用, 用于生成token
])
# 2. 配置jwt登录鉴权方式
REST_FRAMEWORK.setdefault(
    'DEFAULT_AUTHENTICATION_CLASSES', (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
        # 'rest_framework.authentication.BasicAuthentication',
    )
)
# 3. 配置jwt配置项
SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=720),  # 访问令牌的有效时间
    "REFRESH_TOKEN_LIFETIME": timedelta(days=1),  # 刷新令牌的有效时间

    "ROTATE_REFRESH_TOKENS": False,  # 若为True，则刷新后新的refresh_token有更新的有效时间
    "BLACKLIST_AFTER_ROTATION": True,  # 若为True，刷新后的token将添加到黑名单中,

    "ALGORITHM": "HS256",  # 对称算法：HS256 HS384 HS512  非对称算法：RSA
    "SIGNING_KEY": SECRET_KEY,
    "VERIFYING_KEY": None,  # if signing_key, verifying_key will be ignore.
    "AUDIENCE": None,
    "ISSUER": None,

    "AUTH_HEADER_TYPES": ("Bearer",),  # Authorization: Bearer <token>
    "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",  # if HTTP_X_ACCESS_TOKEN, X_ACCESS_TOKEN: Bearer <token>
    "USER_ID_FIELD": "id",  # 使用唯一不变的数据库字段,将包含在生成的令牌中以标识用户
    "USER_ID_CLAIM": "user_id",

}

# ================================================== #
# ******************* 定制任务配置 ******************* #
# ================================================= #

# 1. 注册第三方应用
INSTALLED_APPS.extend([
    "django_celery_beat",  # 定时任务'
])

# 2. 定时任务配置
CELERY_TIMEZONE = 'Asia/Shanghai'  # 时区
CELERY_TASK_TRACK_STARTED = True  # 是否跟踪任务的启动
CELERY_TASK_TIME_LIMIT = 30 * 60  # 任务的超时时间
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True  # 是否重试连接
CELERY_BROKER_URL = 'redis://localhost:6379/1'  # 任务队列的连接地址
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'  # 结果存储后端
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'  # 定时任务的调度器

""" 启动命令:
# 运行worker 启动异步任务
celery -A 项目名 worker -l info -P threads

# 运行beat 启动定时任务
celery -A 项目名 beat -l INFO
"""

# ================================================= #
# ******************* 数据库配置 ******************* #
# ================================================= #

from conf.env import *

DATABASES = {
    'default': {
        'ENGINE': DATABASE_ENGINE,
        'NAME': DATABASE_NAME,
        'USER': DATABASE_USER,
        'PASSWORD': DATABASE_PASSWORD,
        'HOST': DATABASE_HOST,
        'PORT': DATABASE_PORT,
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8mb4',
        },
    }
}
AUTH_USER_MODEL = "auth.User"  # 自定义用户模型

# ================================================= #
# ******************* 其他设置 ******************* #
# ================================================= #
# 语言与时区设置
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

# 静态文件设置
MEDIA_ROOT = BASE_DIR / 'media' / 'files'  # 上传文件的根目录
MEDIA_URL = '/media/files/'  # 上传文件的访问路径

# ================================================= #
# ****************** Ajax跨域设置 ****************** #
# ================================================= #
"""
在 Django 项目中，如果后端和前端分别部署在不同的域名、端口下就会产生跨域请求。前端调用后端接口时，会触发跨域问题。
跨域问题是浏览器的安全策略（同源策略）限制造成的，即浏览器不允许跨域请求。
"""
# 1. 注册跨域app
INSTALLED_APPS.extend([
    "corsheaders",  # 注册跨域app
])
# 2. 注册跨域中间件
MIDDLEWARE.extend([
    "corsheaders.middleware.CorsMiddleware",  # 注册跨域中间件
])
# 3. 配置跨域
# 凡是出现在白名单中的域名，都可以访问后端接口
# CORS_ORIGIN_WHITELIST = (
#     'http://127.0.0.1:8848',
#     'http://localhost:8080',
# )
# 全部允许配置
CORS_ORIGIN_ALLOW_ALL = True
# 允许cookie
CORS_ALLOW_CREDENTIALS = True  # 指明在跨域访问中，后端是否支持对cookie的操作

"""
注意点：
- 1、浏览器(不是前端)会第一次先发送options请求询问后端是否允许跨域
- 2、后端在响应结果中告知浏览器允许跨域，允许的情况下浏览器再发送跨域请求
"""
